﻿using apitest.Application.Entities.Pms;
using apitest.Application.Entities.Test;
using Furion.Logging.Extensions;
using MiniExcelLibs;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Reflection;
using System.Web;

namespace apitest.Application
{
    public class TestService :IDynamicApiController
    {
        public readonly ISqlSugarClient _db;

        public TestService(ISqlSugarClient db)
        {
            _db = db;

        }

        /// <summary>
        /// 根据数据库表生成Class文件
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public void CreateClassFile()
        {
            var db = App.GetService<ISqlSugarClient>();
            var dd = db.AsTenant().GetConnection("ylkj");

            //db.DbFirst.Where(o => o.StartsWith("HR_User")).CreateClassFile("C:\\123");
            dd.DbFirst.Where(o => o== "T_PRD_PICKMTRL").CreateClassFile("C:\\123");
            dd.DbFirst.Where(o => o== "T_PRD_PICKMTRLDATA").CreateClassFile("C:\\123");
        }

        /// <summary>
        /// 根据类创建数据库表
        /// </summary>
        /// <returns></returns>

        [HttpGet]
        public void CreateTable()
        {
            var _testDb = _db.AsTenant().GetConnection("test");
            _testDb.CodeFirst.InitTables(typeof(RP_PMS_TestRequest));
        }

        [HttpGet]
        public async Task<dynamic> T1()
        {
            "撒地方回家咯撒反对".LogInformation();
            return "list";
        }

        [HttpGet("/WW_verify_HBxyjUZvMvJjbiPE.txt"), NonUnify]
        public async Task<dynamic> T123()
        {
            return "HBxyjUZvMvJjbiPE";
        }

        [HttpGet]
        public async Task<dynamic> T999()
        {
            var res = await _db.Queryable<WeChatUser_RT>()
                .Where(o=>o.Name=="陈佳")
              .ToListAsync();
            return res;
        }

        [HttpGet, QueryParameters, NonUnify]
        public async Task<dynamic> T2(SeachDto data)
        {
            var res = new List<Car>();
            for (int i = 0; i < 20; i++)
            {
                var car = new Car()
                {
                    Id = i,
                    Name = i,
                    Age = i
                };
                res.Add(car);
            }
            return res;
        }

        [HttpPost]
        public async Task<dynamic> Edit(object data)
        {
            return data;
        }

        [HttpGet, QueryParameters, NonUnify]
        public async Task<dynamic> Login(LoginDto data)
        {
            //   return data;
            if (data.UserName == "admin" && data.Password == "123456")
            {
                return
                new
                {
                    status = 0,

                };

            }
            else
            {
                return
             new
             {
                 status = 1,
                 msg = "用户名或密码不正确"
             };
                throw new Exception("用户名或密码不正确");
            }
        }

        [HttpPost, NonUnify]
        public async Task<dynamic> Hr2Test(object data)
        {
            var obj = JObject.Parse(data.ToString());
            if (obj["key"].ToString() == "approve_result")
            {
                var list = JArray.Parse(obj["data"].ToString());
                foreach (var item in list)
                {
                    item["submit_title"] = HttpUtility.UrlDecode(item["submit_title"].ToString());
                    item.ToString().LogInformation();
                }

            }
            return new
            {
                result_code = "SUCCESS",
                result_msg = "OK"
            };
        }

        [HttpGet("HandlerCustomer")]
        public async Task<dynamic> HandlerCustomer()
        {
            var list = MiniExcel.Query<Customer>("客.xlsx").ToList();
            //var path = "111.xlsx";
            //if (File.Exists(path))
            //{
            //    File.Delete(path);
            //}
            //MiniExcel.SaveAs(path, list);
            var columnList = MiniExcel.GetColumns("客.xlsx", useHeaderRow: true);
            //return columnList;
            var customerList = new List<string>();
            foreach (var item in list)
            {
                var name = item.客户名称;
                if (!customerList.Contains(item.客户名称))
                {
                    customerList.Add(name);
                }
            }
            var res = new List<Customer>();
            var temp = new Dictionary<int, int>();
            var ids = new List<int>();
            foreach (var customer in customerList)
            {
                var l = list.Where(o => o.客户名称 == customer).ToList();

                foreach (var item in l)
                {
                    Type type = typeof(Customer);
                    var props = type.GetProperties();
                    var total = 0;
                    foreach (var prop in props)
                    {
                        var val = prop.GetValue(item, null);
                        if (val != null)
                        {
                            await Console.Out.WriteLineAsync(val.ToString());
                            total += 1;
                        }

                    }
                    if (temp.Count == 0)
                    {
                        temp.Add(item.Id, total);
                    }
                    else
                    {
                        var first = temp.FirstOrDefault();
                        var val = first.Value;
                        if (val < total)
                        {
                            temp.Remove(first.Key);
                            temp.Add(item.Id, total);
                        }
                    }
                    total = 0;

                }
                ids.Add(temp.FirstOrDefault().Key);
                temp.Clear();
            }

            //foreach (var item in temp)
            //{
            //    ids.Add(item.Key);
            //}
            res = list.Where(o => ids.Contains(o.Id)).ToList();
            var path = "111.xlsx";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            MiniExcel.SaveAs(path, res);
            return res;
            return list.Take(10).ToList();
        }

        [HttpGet]
        public async Task<dynamic> T3()
        {
            Assembly ass = Assembly.Load("apitest.Application");
            var t = ass.GetType();
            //遍历程序集里所有Type的全名
            foreach (var a in ass.GetTypes())
            {

                if (a.Name == "Car")
                {
                    var props = t.GetProperties();
                    var fields = t.GetFields();
                    MemberInfo[] members = t.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
                    foreach (var item in members)
                    {
                        if (item.MemberType != MemberTypes.Property)
                        {
                            Console.WriteLine("当前属性为:" + item.MemberType);
                            continue;
                        }
                        Console.WriteLine("item.Name-------------------" + item.Name); //属性名称
                        Console.WriteLine("item.MemberType---------------" + item.MemberType);//属性类型
                    }
                }
            }
            Type assType = ass.GetType();

            return "";

            var res = Activator.CreateInstance(ass.GetType());
            return res;
        }
        public async Task<dynamic> T11()
        {
            var col = MiniExcel.Query("化学.xlsx", useHeaderRow: true).ToList();
            var now = DateTime.Now.ToShortDateString();
            var res1 = new List<Template1>();
            var res2 = new List<Template2>();
            var res3 = new List<Template3>();
            foreach (var item in col)
            {
                JObject obj = JObject.Parse(JsonConvert.SerializeObject(item));
                var template1 = new Template1()
                {
                    客户名称 = obj["名称"].ToString(),
                    ERP客户代码 = obj["代码"].ToString(),
                    是否正式客户 = "是",
                    客户类型 = "",
                    客户来源 = "",
                    客户区域 = "",
                    客户详细地址 = obj["地址"].ToString(),
                    最后拜访日期 = now,
                    历史成交金额 = "",
                    成交次数 = "",
                    最早交易日期 = "",
                    税号 = obj["税务登记号"].ToString(),
                    开户行 = obj["开户银行"].ToString(),
                    银行账号 = obj["银行账号"].ToString(),
                    地址联系方式 = "",
                    客户合作年限 = "",
                    当天日期 = now,
                    客户状态 = "启用",
                    预警状态 = "正常",
                    化学预警状态 = "正常",
                    共营类型 = "化学专营",
                    最近签单时间 = "",
                    持有人 = "",
                    持有部门 = "",
                    持有状态 = "",

                    化学持有人 = obj["BD"].ToString(),
                    化学持有部门 = "化学公司",
                    化学持有状态 = "持有中",
                };
                res1.Add(template1);
                if (obj["联系人"] != null || obj["电话"] != null || obj["移动电话"] != null)
                {
                    var template3 = new Template3()
                    {
                        客户名称 = obj["名称"].ToString(),
                        客户联系人 = obj["联系人"] != null ? obj["联系人"].ToString() : "",
                        电话座机 = obj["电话"] != null ? obj["电话"].ToString() : ""
                    };
                    if (obj["移动电话"] != null)
                    {
                        template3.电话座机 = template3.电话座机 + " " + obj["移动电话"].ToString();
                    }
                    res3.Add(template3);
                }

            }
            var path = "huaxue/客户档案.xlsx";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            MiniExcel.SaveAs(path, res1, sheetName: "客户档案");
            path = "huaxue/明细表1.xlsx";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            MiniExcel.SaveAs(path, res2, sheetName: "明细表1");
            path = "huaxue/明细表2.xlsx";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            MiniExcel.SaveAs(path, res3, sheetName: "明细表2");
            return 1;
        }
        public async Task HandlerCRM()
        {

            var customerList = MiniExcel.Query<Customer>("客户清单.xlsx").ToList();
            var res1 = new List<Template1>();
            var res2 = new List<Template2>();
            var res3 = new List<Template3>();
            var now = DateTime.Now.ToShortDateString();
            customerList.ForEach(item =>
            {
                var template1 = new Template1()
                {
                    客户名称 = item.客户名称,
                    ERP客户代码 = item.客户编码,
                    是否正式客户 = "是",
                    客户类型 = "",
                    客户来源 = "",
                    客户区域 = item.客户区域,
                    客户详细地址 = item.详细地址,
                    最后拜访日期 = now,
                    历史成交金额 = "",
                    成交次数 = "",
                    最早交易日期 = string.IsNullOrWhiteSpace(item.最早签单时间) ? "" : DateTime.Parse(item.最早签单时间).ToShortDateString(),
                    税号 = item.纳税登记号,
                    开户行 = item.开户银行,
                    银行账号 = item.银行账号,
                    地址联系方式 = "",
                    客户合作年限 = "",
                    当天日期 = now,
                    客户状态 = "启用",
                    预警状态 = "正常",
                    化学预警状态 = "正常",
                    共营类型 = "",
                    最近签单时间 = string.IsNullOrWhiteSpace(item.最近签单时间) ? "" : DateTime.Parse(item.最近签单时间).ToShortDateString(),

                    持有人 = "",
                    持有部门 = "",
                    持有状态 = "",

                    化学持有人 = "",
                    化学持有部门 = "",
                    化学持有状态 = "",
                };
                if (item.是否是化学公司客户 == "是")
                {
                    if (string.IsNullOrWhiteSpace(item.销售部门))
                    {
                        template1.化学持有人 = "卓应";
                        template1.化学持有部门 = "化学公司";
                        template1.化学持有状态 = "持有中";
                        template1.共营类型 = "化学专营";
                        //添加联系人
                        var template3 = new Template3()
                        {
                            客户名称 = item.客户名称,
                            客户联系人 = item.默认联系人,
                            电话座机 = item.移动电话
                        };
                        res3.Add(template3);
                    }
                    else
                    {
                        if (item.销售部门 != "化学公司")
                        {
                            template1.持有人 = item.销售员;
                            template1.持有部门 = item.销售部门;
                            template1.持有状态 = "持有中";
                            template1.化学持有人 = "卓应";
                            template1.化学持有部门 = "化学公司";
                            template1.化学持有状态 = "持有中";
                            template1.共营类型 = "生物化学共营";
                            //添加联系人
                            var template2 = new Template2()
                            {
                                客户名称 = item.客户名称,
                                客户联系人 = item.默认联系人,
                                电话座机 = item.移动电话
                            };
                            res2.Add(template2);

                        }
                        else
                        {
                            template1.化学持有人 = "卓应";
                            template1.化学持有部门 = "化学公司";
                            template1.化学持有状态 = "持有中";
                            template1.共营类型 = "化学专营";
                            //添加联系人
                            var template3 = new Template3()
                            {
                                客户名称 = item.客户名称,
                                客户联系人 = item.默认联系人,
                                电话座机 = item.移动电话
                            };
                            res3.Add(template3);
                        }
                    }
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(item.销售部门))
                    {
                        template1.持有状态 = "归入公海";
                    }
                    else
                    {
                        if (item.销售部门 == "化学公司")
                        {
                            template1.化学持有人 = "卓应";
                            template1.化学持有部门 = "化学公司";
                            template1.化学持有状态 = "持有中";
                            template1.共营类型 = "化学专营";
                            //添加联系人
                            var template3 = new Template3()
                            {
                                客户名称 = item.客户名称,
                                客户联系人 = item.默认联系人,
                                电话座机 = item.移动电话
                            };
                            res3.Add(template3);
                        }
                        else
                        {
                            template1.持有人 = item.销售员;
                            template1.持有部门 = item.销售部门;
                            template1.持有状态 = "持有中";
                            template1.共营类型 = "生物专营";
                            //添加联系人
                            var template2 = new Template2()
                            {
                                客户名称 = item.客户名称,
                                客户联系人 = item.默认联系人,
                                电话座机 = item.移动电话
                            };
                            res2.Add(template2);
                        }
                    }
                }
                res1.Add(template1);
            });
            var path = "客户档案.xlsx";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            MiniExcel.SaveAs(path, res1, sheetName: "客户档案");
            path = "明细表1.xlsx";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            MiniExcel.SaveAs(path, res2, sheetName: "明细表1");
            path = "明细表2.xlsx";
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            MiniExcel.SaveAs(path, res3, sheetName: "明细表2");
        }

        public async Task<dynamic> TimeTest(long timestamp)
        {
            long begtime = timestamp * 10000;
            DateTime dt_1970 = new DateTime(1970, 1, 1, 8, 0, 0);
            long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度
            long time_tricks = tricks_1970 + begtime;//日志日期刻度
            DateTime dt = new DateTime(time_tricks);//转化为DateTime
            return dt.ToString("yyyy-MM-dd");
        }
    }

    public class Car
    {
        public string aa = "3213";
        public int Id { get; set; }
        public int Name { get; set; }
        public int Age { get; set; }
    }

    public class LoginDto
    {
        public string UserName { get; set; }
        public string Password { get; set; }
    }
    public class SeachDto
    {
        public int Page { get; set; }
        public int PerPage { get; set; }
    }

    public class Customer
    {
        public int Id { get; set; }
        public string 客户编码 { get; set; }
        public string 使用组织 { get; set; }
        public string 客户名称 { get; set; }
        public string 销售部门 { get; set; }
        public string 销售员 { get; set; }
        public string 最早签单时间 { get; set; }
        public string 最近签单时间 { get; set; }
        public string 是否是化学公司客户 { get; set; }
        public string 国家 { get; set; }
        public string 地区 { get; set; }
        public string 通讯地址 { get; set; }
        public string 联系电话 { get; set; }
        public string 发票抬头 { get; set; }
        public string 纳税登记号 { get; set; }
        public string 开户银行 { get; set; }
        public string 银行账号 { get; set; }
        public string 开票联系电话 { get; set; }
        public string 开票通讯地址 { get; set; }
        public string 对应集团客户 { get; set; }
        public string 统一社会信用代码 { get; set; }
        public string 注册地址 { get; set; }
        public string 客户区域 { get; set; }
        public string 省份 { get; set; }
        public string 默认联系人 { get; set; }
        public string 详细地址 { get; set; }
        public string 移动电话 { get; set; }
    }

    public class Template1
    {
        public string 客户名称 { get; set; }
        public string ERP客户代码 { get; set; }
        public string 持有人 { get; set; }
        public string 持有部门 { get; set; }
        public string 是否正式客户 { get; set; }
        public string 客户类型 { get; set; }
        public string 客户来源 { get; set; }
        public string 客户区域 { get; set; }
        public string 客户详细地址 { get; set; }
        public string 最后拜访日期 { get; set; }
        public string 历史成交金额 { get; set; }
        public string 成交次数 { get; set; }
        public string 最早交易日期 { get; set; }
        public string 税号 { get; set; }
        public string 开户行 { get; set; }
        public string 银行账号 { get; set; }
        public string 地址联系方式 { get; set; }
        public string 客户合作年限 { get; set; }
        public string 当天日期 { get; set; }
        public string 客户状态 { get; set; }
        public string 预警状态 { get; set; }
        public string 持有状态 { get; set; }
        public string 化学持有人 { get; set; }
        public string 化学持有部门 { get; set; }
        public string 化学最后拜访日期 { get; set; }
        public string 化学预警状态 { get; set; }
        public string 化学持有状态 { get; set; }
        public string 共营类型 { get; set; }
        public string 最近签单时间 { get; set; }
    }

    public class Template2
    {
        public string 客户名称 { get; set; }
        public string 客户联系人 { get; set; }
        public string 性别 { get; set; }
        public string 职位 { get; set; }
        public string 电话座机 { get; set; }
        public string 邮箱 { get; set; }
        public string 喜欢及禁忌 { get; set; }
        public string 备注 { get; set; }
        public string 唯一标准 { get; set; }
    }

    public class Template3
    {
        public string 客户名称 { get; set; }
        public string 客户联系人 { get; set; }
        public string 性别 { get; set; }
        public string 职位 { get; set; }
        public string 电话座机 { get; set; }
        public string 邮箱 { get; set; }
        public string 喜欢及禁忌 { get; set; }
        public string 备注 { get; set; }
        public string 唯一标准 { get; set; }
    }
}
